home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1995 June / MacFormat 25.iso / Shareware City / Developers / fortran-to-c-translator-11 / Mac F2C 1.1 / Mac F2C Documentation / If Floats Don't Display Right / g_fmt.c < prev    next >
Text File  |  1994-12-18  |  2KB  |  95 lines

  1. /****************************************************************
  2.  *
  3.  * The author of this software is David M. Gay.
  4.  * 
  5.  * Copyright (c) 1991 by AT&T.
  6.  * 
  7.  * Permission to use, copy, modify, and distribute this software for any
  8.  * purpose without fee is hereby granted, provided that this entire notice
  9.  * is included in all copies of any software which is or includes a copy
  10.  * or modification of this software and in all copies of the supporting
  11.  * documentation for such software.
  12.  * 
  13.  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
  14.  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
  15.  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
  16.  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  17.  *
  18.  ***************************************************************/
  19.  
  20. /* g_fmt(buf,x) stores the closest decimal approximation to x in buf;
  21.  * it suffices to declare buf
  22.  *    char buf[32];
  23.  */
  24.  
  25. #ifdef __cplusplus
  26. extern "C" char *dtoa(double, int, int, int *, int *, char **);
  27. extern "C" void g_fmt(char *, double);
  28. #else
  29. extern     char *dtoa(double, int, int, int *, int *, char **);
  30. #endif
  31.  
  32.  void
  33. g_fmt(register char *b, double x)
  34. {
  35.     register int i, k;
  36.     register char *s;
  37.     int decpt, j, sign;
  38.     char *se;
  39.  
  40.     if (!x) {
  41.         *b++ = '0';
  42.         *b = 0;
  43.         return;
  44.         }
  45.     s = dtoa(x, 0, 0, &decpt, &sign, &se);
  46.     if (sign)
  47.         *b++ = '-';
  48.     if (decpt == 9999) /* Infinity or Nan */ {
  49.         while(*b++ = *s++);
  50.         return;
  51.         }
  52.     if (decpt <= -4 || decpt > se - s + 5) {
  53.         *b++ = *s++;
  54.         if (*s) {
  55.             *b++ = '.';
  56.             while(*b = *s++)
  57.                 b++;
  58.             }
  59.         *b++ = 'e';
  60.         /* sprintf(b, "%+.2d", decpt - 1); */
  61.         if (--decpt < 0) {
  62.             *b++ = '-';
  63.             decpt = -decpt;
  64.             }
  65.         else
  66.             *b++ = '+';
  67.         for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10);
  68.         for(;;) {
  69.             i = decpt / k;
  70.             *b++ = i + '0';
  71.             if (--j <= 0)
  72.                 break;
  73.             decpt -= i*k;
  74.             decpt *= 10;
  75.             }
  76.         *b = 0;
  77.         }
  78.     else if (decpt <= 0) {
  79.         *b++ = '.';
  80.         for(; decpt < 0; decpt++)
  81.             *b++ = '0';
  82.         while(*b++ = *s++);
  83.         }
  84.     else {
  85.         while(*b = *s++) {
  86.             b++;
  87.             if (--decpt == 0 && *s)
  88.                 *b++ = '.';
  89.             }
  90.         for(; decpt > 0; decpt--)
  91.             *b++ = '0';
  92.         *b = 0;
  93.         }
  94.     }
  95.